package exo2;

import java.awt.Graphics;

public class HkSol extends Hk
{
    private static final long serialVersionUID = 1L;
    
	public HkSol(int prof) 
	{
	    super(prof);
	}

	/**
     * Fonction drawHk : Dessine Hk de manière récursive
     * @param x1 Abscisse du point de l'extrémité
     * @param y1 Ordonnée du point de l'extrémité
     * @param k  Profondeur de récurrence
     * @param l  Longueur du carré
     * @param or Orientation du U
     * @param g  Zone graphique
     */
	@Override
	public void drawHk (int x1, int y1, int k, int l, int or, Graphics g) 
	{
	    // Points
	    int x2 = 0;
        int y2 = 0;
        int x3 = 0;
        int y3 = 0;
        int x4 = 0;
        int y4 = 0;
        
        // Fin de récurrence
        if (k == 1)
        {
            switch (or) 
            {
              case 0:// U vers la gauche
                x2 = x1 - l;
                y2 = y1;   
                x3 = x2;
                y3 = y1 + l;
                x4 = x1;
                y4 = y3;
                break;
                
              case 1:// U vers en haut
                x2 = x1;
                y2 = y1 - l;   
                x3 = x2 + l;
                y3 = y2;
                x4 = x3;
                y4 = y1;
                break;
                
              case 2:// U vers la droite
                x2 = x1 + l;
                y2 = y1;   
                x3 = x2;
                y3 = y2 - l;
                x4 = x1;
                y4 = y3;
                break;

              default:// U vers en bas
                x2 = x1;
                y2 = y1 + l;
                x3 = x2 + l;
                y3 = y2;
                x4 = x3;
                y4 = y1;
                break;
            }
            
            // Draw U
            g.drawLine(x1, y1, x2, y2);
            g.drawLine(x2, y2, x3, y3);
            g.drawLine(x3, y3, x4, y4);
        }
        // Récurrence
        else
        {
            switch (or)
            {
              case 0: // Vers la gauche
                // Calcul nouveau point de calcul
                y1 = y1 + l;
                x2 = x1 - l/2;
                y2 = y1 - l/2;
                x3 = x2;
                y3 = y2 - l;
                x4 = x1;
                y4 = y3;
                break;
                
              case 1: // Vers le haut
                x2 = x1;
                y2 = y1 - l;
                x3 = x2 + l;
                y3 = y2 ;
                x4 = x3 + l/2;
                y4 = y3 + l/2;
                break;
                
              case 2: // Vers la droite
                y1 = y1 - (3*l)/2;
                x2 = x1 + l;
                y2 = y1 + l/2;
                x3 = x2;
                y3 = y2 + l;
                x4 = x3 - l;
                y4 = y3;
                break;

              default: // Vers en bas
                x1 = x1 + (3*l)/2;
                y1 = y1 - l/2;
                x2 = x1 - l/2;
                y2 = y1 + l;
                x3 = x2 - l;
                y3 = y2 ;
                x4 = x3;
                y4 = y1 + l/2;
                break;
            }
            
            // Appels récursifs pour les 4 sous-carrés
            drawHk(x1, y1, k-1, l/2, (or+1)%4, g);
            drawHk(x2, y2, k-1, l/2, or, g);
            drawHk(x3, y3, k-1, l/2, or, g);
            drawHk(x4, y4, k-1, l/2, (or+3)%4, g);
        }
    }
}
